﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace CMS_GYM
{
    public partial class frmThongTinPhieuThu : Form
    {
        #region Attributes
        public clsPhieuThuTienDTO PhieuThu = null;
        string SoPhieuThu= string.Empty;
        string KyHieu = string.Empty;
        public Boolean IsThaoTac = false;
        #endregion

        #region Contruction
        public frmThongTinPhieuThu()
        {
            InitializeComponent();
        }

        public frmThongTinPhieuThu(string _SoPhieuThu, string _KyHieu)
        {
            InitializeComponent();
            SoPhieuThu = _SoPhieuThu;
            KyHieu = _KyHieu;
        }
        #endregion

        #region events
        private void frmThongTinPhieuThu_Load(object sender, EventArgs e)
        {
            try
            {
                gvPhieuThuChiTiet.AutoGenerateColumns=false;
                if (!string.IsNullOrEmpty(SoPhieuThu) && !string.IsNullOrEmpty(KyHieu))
                {
                    PhieuThu = new clsPhieuThuTienBUS().LayThongTinMotPhieuThu(SoPhieuThu, KyHieu);
                    if (PhieuThu != null)
                    {
                        txtSoPhieuThu.Text=PhieuThu.SoPhieuThu;
                        txtKyHieu.Text = PhieuThu.KyHieu;
                        txtMaKhachHang.Text=PhieuThu.MaKhachHang;
                        txtTenKhachHang.Text = PhieuThu.HoTen;
                        txtMaSoThue.Text=PhieuThu.MaSoThue;
                        txtDiaChiaXHD.Text=PhieuThu.DiaChi;
                        txtdNgayXuat.value=PhieuThu.NgayXuat;
                        txtThueVAT.Text=PhieuThu.PhanTramThue.ToString();
                        txtGhiChu.Text=PhieuThu.GhiChu;
                        clsNhanVienDTO NguoiXuat = new clsNhanVienBUS().LayThongTinMotNhanVien(PhieuThu.NguoiTaoId.ToString());
                        lblNguoiXuat.Text = NguoiXuat == null ? string.Empty : NguoiXuat.TenNhanVien;
                        lblNgayTao.Text = String.Format("{0:dd/MM/yyyy}", PhieuThu.NgayTao);

                        if (PhieuThu.NguoiChinhSuaId != null)
                        {
                            clsNhanVienDTO NguoiSua = new clsNhanVienBUS().LayThongTinMotNhanVien(PhieuThu.NguoiChinhSuaId.ToString());
                            lblNguoiChinhSua.Text = NguoiSua == null ? string.Empty : NguoiSua.TenNhanVien;
                        }
                        else
                        {
                            lblNguoiChinhSua.Text = string.Empty;
                        }
                        if (PhieuThu.NgayChinhSua != null)
                        {
                            lblNgayChinhSua.Text = String.Format("{0:dd/MM/yyyy}", PhieuThu.NgayChinhSua);
                        }
                        else
                        {
                            lblNgayChinhSua.Text = string.Empty;
                        }
                        gvPhieuThuChiTiet.DataSource=new clsPhieuThuTienBUS().LayBangPhieuThuChiet(PhieuThu.PhieuThuId);
                        lblTongTienThu.Text =clsSupport.CurrencyNumber(PhieuThu.TongTienThu.ToString());
                        lblTongChietKhau.Text = clsSupport.CurrencyNumber(PhieuThu.TongChietKhau.ToString()); 
                        lblSoTienChu.Text = hsTool.ConvertMoneyToText(PhieuThu.TongTienThu.ToString());
                    }
                    else
                    {
                        MessageBox.Show("Không lấy được thông tin phiếu thu với số phiếu thu: " + SoPhieuThu + " và ký hiệu: " + KyHieu, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        this.Close();
                    }
                }
            }
            catch (Exception) 
            { }
            SetPermission();
        }

        private void gvPhieuThuChiTiet_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
                {
                    if (string.Equals(gvPhieuThuChiTiet.Columns[e.ColumnIndex].Name, "TienThu")
                        || string.Equals(gvPhieuThuChiTiet.Columns[e.ColumnIndex].Name, "ChietKhau"))
                    {
                        TinhTongCongNo();
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            try
            {
                string Error = string.Empty;
                DialogResult result = MessageBox.Show("Bạn có thật sự muốn xóa phiếu thu không?", "Xác nhận thông tin", MessageBoxButtons.YesNo);
                if (result == DialogResult.Yes)
                {
                    if (PhieuThu != null)
                    {
                        try
                        {
                            CSQLServer.BeginTran();
                            if (new clsPhieuThuTienBUS().Xoa(PhieuThu.PhieuThuId, ref Error))
                            {
                                CSQLServer.Commit();
                                IsThaoTac = true;
                                MessageBox.Show("Xóa phiếu thu với số " + PhieuThu.SoPhieuThu + " và ký hiệu " + PhieuThu.KyHieu + "  thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                this.Close();
                            }
                            else
                            {
                                CSQLServer.RollBack();
                                MessageBox.Show("Xóa phiếu thu với số " + PhieuThu.SoPhieuThu + " và ký hiệu " + PhieuThu.KyHieu + " không thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                        catch (Exception ex)
                        {
                            CSQLServer.RollBack();
                            MessageBox.Show("Lưu phiếu thu không thành công nguyên nhân do " + Error + "!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Xóa phiếu thu không thành công do không lấy được thông tin phiếu thu!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
            catch (Exception ex)
            { }
        }

        private void btnLuu_Click(object sender, EventArgs e)
        {
            try
            {
                string Error = string.Empty;
                int indexforcus = 0;
                if (KiemTraKhoiTaoPhieuThu(ref Error, ref indexforcus))
                {

                    if (KhoiTaoPhieuThu(ref  Error))
                    {
                        try
                        {
                            CSQLServer.BeginTran();
                            if (new clsPhieuThuTienBUS().Sua(PhieuThu, ref Error))
                            {
                                CSQLServer.Commit();
                                if (chkIn.Checked)
                                {
                                    frmPhieuThuReportViewer PTReportViewer = new frmPhieuThuReportViewer(PhieuThu);
                                    PTReportViewer.ShowDialog();
                                }
                                else
                                {
                                    MessageBox.Show("Lưu phiếu thu thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                }
                                //MessageBox.Show("Lưu phiếu thu thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                //LamTuoiManHinh();
                            }
                            else
                            {
                                CSQLServer.RollBack();
                                MessageBox.Show(Error, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                        catch (Exception ex)
                        {
                            CSQLServer.RollBack();
                            MessageBox.Show("Lưu phiếu thu không thành công nguyên nhân do " + Error + "!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Lưu phiếu thu không thành công nguyên nhân do " + Error + "!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    MessageBox.Show(Error, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {

            }
        }

        // Hàm bắt sự kiện nhấn một phím trên Form. CTRL + ....
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            bool bKetQua = false;
            try
            {

                //------------------------------------
                if (keyData == Keys.Escape)
                {
                    this.Close();
                    bKetQua = true;
                }
                else if (keyData == (Keys.Control | Keys.S) && (btnLuu.Enabled))
                {
                    btnLuu_Click(null, null);
                }
                else if (keyData == (Keys.Control | Keys.D) && (btnXoa.Enabled))
                {
                    btnXoa_Click(null, null);
                }
                else
                    // bKetQua = base.ProcessCmdKey(ref msg, keyData);
                    bKetQua = false;
                return bKetQua;
            }
            catch (Exception) { }

            return bKetQua;
        }

        #endregion

        #region functions

        /// Khoi tao mot phieu thu
        /// </summary>
        /// <param name="Error"></param>
        /// <returns></returns>
        private bool KhoiTaoPhieuThu(ref string Error)
        {
            try
            {
                PhieuThu.SoPhieuThu = txtSoPhieuThu.Text;
                PhieuThu.KyHieu = txtKyHieu.Text;
                PhieuThu.Ky = txtdNgayXuat.value.ToString("MM/yyyy");
                PhieuThu.NgayXuat = txtdNgayXuat.value;
                PhieuThu.MaKhachHang = txtMaKhachHang.Text;
                PhieuThu.HoTen = txtTenKhachHang.Text;
                PhieuThu.MaSoThue = txtMaSoThue.Text;
                PhieuThu.DiaChi = txtDiaChiaXHD.Text;
                PhieuThu.PhanTramThue = int.Parse(txtThueVAT.Text);
                PhieuThu.GhiChu = txtGhiChu.Text;
                PhieuThu.NguoiChinhSuaId = clsUser.NhanVienId;
                PhieuThu.NgayChinhSua = DateTime.Now;
                for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
                {
                    KhoiTaoPhieuThuChiTiet(i, PhieuThu.PhanTramThue);
                }

                PhieuThu.TongTienThu = 0;
                PhieuThu.TongTienHang = 0;
                PhieuThu.TongTienThue = 0;
                PhieuThu.TongChietKhau = 0;
                for (int k = 0; k < PhieuThu.CacPTCT.Count; k++)
                {
                    PhieuThu.TongTienThu += PhieuThu.CacPTCT[k].TienThu;
                    PhieuThu.TongTienHang += PhieuThu.CacPTCT[k].TienHang;
                    PhieuThu.TongTienThue += PhieuThu.CacPTCT[k].TienThue;
                    PhieuThu.TongChietKhau += PhieuThu.CacPTCT[k].ChietKhau;
                }
            }
            catch (Exception)
            {
                Error = "Khởi tạo phiếu thu không thành công!";
                return false;
            }
            return true;
        }

        /// <summary>
        /// Khoi tao mot phieu thu chi tiet
        /// </summary>
        /// <param name="i"></param>
        /// <param name="ThueGTGT"></param>
        /// <returns></returns>
        private void KhoiTaoPhieuThuChiTiet(int i, int ThueGTGT)
        {
            for (int k = 0; k < PhieuThu.CacPTCT.Count; k++)
            {
                if (decimal.Parse(gvPhieuThuChiTiet.Rows[i].Cells["PhieuThuChiTietId"].Value.ToString()) == PhieuThu.CacPTCT[k].PhieuThuChiTietId)
                {
                    PhieuThu.CacPTCT[k].NoiDungThu = gvPhieuThuChiTiet.Rows[i].Cells["NoiDungThu"].Value.ToString();
                    PhieuThu.CacPTCT[k].TienThu = Double.Parse(gvPhieuThuChiTiet.Rows[i].Cells["TienThu"].Value.ToString());
                    PhieuThu.CacPTCT[k].TienThue = ThueGTGT > 0 ? Math.Round(PhieuThu.CacPTCT[i].TienThu / ThueGTGT, 0) : 0;
                    PhieuThu.CacPTCT[k].TienHang = PhieuThu.CacPTCT[k].TienThu - PhieuThu.CacPTCT[k].TienThue;
                    PhieuThu.CacPTCT[k].ChietKhau = gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value.ToString()) ? 0 : Double.Parse(gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value.ToString());
                    PhieuThu.CacPTCT[k].TaiKhoanNo = gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value.ToString();
                    PhieuThu.CacPTCT[k].TaiKhoanCo = gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value.ToString();
                    //PhieuThu.CacPTCT[k].TheId = gvPhieuThuChiTiet.Rows[i].Cells["TheThuId"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["TheThuId"].Value.ToString()) ? null : (decimal?)decimal.Parse(gvPhieuThuChiTiet.Rows[i].Cells["TheThuId"].Value.ToString());
                }
            }
        }

        private bool KiemTraKhoiTaoPhieuThu(ref string strError, ref int indexforcus)
        {
            bool Flag = true;
            strError = "Lỗi phát sinh: ";

            #region Kiểm tra phiếu thu
            //Kiểm tra Tên khách hàng 
            string TEN_TB = txtTenKhachHang.Text;
            if (TEN_TB.Trim() == "")
            {
                strError += "\n + Tên khách hàng không được bỏ trống!";
                indexforcus = 9;
                return false;
            }
            #endregion

            #region Kiểm tra Dia chi
            ////Kiểm tra Tên khách hàng 
            //string DiaChiXHD = txtDiaChiaXHD.Text;
            //if (DiaChiXHD.Trim() == "")
            //{
            //    strError += "\n + Địa chỉ xuất phiếu thu không được bỏ trống!";
            //    indexforcus = 9;
            //        return false; 
            //}
            #endregion

            #region Kiểm tra định dạng số phiếu thu
            //Kiểm tra định dạng số phiếu thu
            string SO_PHIEU_THU = this.txtSoPhieuThu.Text.Trim().Replace(" ", "");
            int SoPhieuThu;
            if (!(SO_PHIEU_THU.Trim() != "" && (SO_PHIEU_THU.Length == 6 || SO_PHIEU_THU.Length == 7) && int.TryParse(SO_PHIEU_THU, out SoPhieuThu)))
            {
                strError += "\n + Số phiếu thu theo định dạng: Số phiếu thu là số gồm 6 hoặc 7 chữ số ví dụ: 000001, 101111, 1234567 ...";
                indexforcus = 9;
                return false;
            }
            #endregion

            #region Kiểm tra ký hiệu phiếu thu (Đã được kiểm tra trên control)
            //Kiểm tra ký hiệu phiếu thu (Đã được kiểm tra trên control)
            string KY_HIEU_HD = this.txtKyHieu.Text;
            if (KY_HIEU_HD == null || KY_HIEU_HD.Trim() == "")
            {
                strError += "\n + Ký hiệu phiếu thu không được bỏ trống!";
                indexforcus = 9;
                return false;
            }
            #endregion

            #region Kiểm tra phần trăm thuế suất(Đã được kiểm tra trên control)
            //Kiểm tra phần trăm thuế suất(Đã được kiểm tra trên control)
            int THUE_SUAT;
            if (!int.TryParse(this.txtThueVAT.Text, out THUE_SUAT))
            {
                strError += "\n + Thuế GTGT là một số thực dương: 20%, 10%...";
                indexforcus = 9;
                return false;
            }
            else
            {
                if (!(THUE_SUAT >= 0 && THUE_SUAT <= 100))
                {
                    strError += "\n + Thuế GTGT phải 0% <= Thuế GTGT <= 100% ";
                    indexforcus = 9;
                    return false;
                }
            }
            #endregion

            #region Kiểm tra ID nhân viên
            //Kiểm tra ID nhân viên thu tiền
            int MaNguoiDung;
            if (!int.TryParse(clsUser.NhanVienId.ToString(), out MaNguoiDung) && Flag)
            {
                strError += "\n + Không lấy được thông tin người dùng đã đăng nhập!";
                indexforcus = 9;
                return false;
            }
            #endregion

            #region Kiểm tra lưới thu tiền
            //Kiểm tra lưới thu tiền
            CMS_DinhKhoan DinhKhoan = new CMS_DinhKhoan();
            List<DINH_KHOAN_NO> DinhKhoanNo = DinhKhoan.GetListDinhKhoanNoCoHieuLuc();
            List<DINH_KHOAN_CO> DinhKhoanCo = DinhKhoan.GetListDinhKhoanCoDoanhThuCoHieuLuc();
            if (!KiemTraLuoiThuTien(DinhKhoanNo, DinhKhoanCo, ref strError))
            {
                indexforcus = 9;
                return false;
            }
            #endregion

            #region Kiểm tra sua ky hieu phieu thu
            string KyHieu = txtKyHieu.Text;
            if (KyHieu.Trim() != PhieuThu.KyHieu.Trim())
            {
                if (new clsPhieuThuTienBUS().KiemTraTonTai(txtSoPhieuThu.Text, KyHieu))
                {
                    strError += "\n + Số phiếu thu và ký hiệu vừa chỉnh sửa đã tồn tại trong hệ thống!";
                    indexforcus = 9;
                    return false;
                }
            }
            #endregion

            return true;
        }

        /// <summary>
        /// Kiểm tra lưới thu tiền
        /// </summary>
        /// <param name="ThueGTGT"></param>
        /// <param name="Error"></param>
        /// <returns></returns>
        private bool KiemTraLuoiThuTien(List<DINH_KHOAN_NO> DinhKhoanNo, List<DINH_KHOAN_CO> DinhKhoanCo, ref string Error)
        {
            int Count = 0;
            try
            {
                for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
                {
                    Count++;
                    Decimal TienThu;
                    Decimal ChietKhau;
                    int TaiKhoanNo;
                    int TaiKhoanCo;
                    if (gvPhieuThuChiTiet.Rows[i].Cells["NoiDungThu"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["NoiDungThu"].Value.ToString()))
                    {
                        Error = "Ô 'Nội dung' thu tiền không được bỏ trống ở dòng thứ " + i.ToString() + "!";
                        return false;
                    }
                    if (gvPhieuThuChiTiet.Rows[i].Cells["TienThu"].Value == null || !Decimal.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["TienThu"].Value.ToString(), out TienThu) || TienThu <= 0)
                    {
                        Error = "Ô 'Tiền thu' phải nhập là số nguyên dương ở dòng thứ " + i.ToString() + "!";
                        return false;
                    }
                    if (gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value != null && (!Decimal.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value.ToString(), out ChietKhau) || ChietKhau < 0))
                    {
                        Error = "Ô 'Chiết khấu' phải nhập là số nguyên dương hoặc bằng 0 ở dòng thứ " + i.ToString() + "!";
                        return false;
                    }
                    if (gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value == null || !int.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value.ToString(), out TaiKhoanNo))
                    {
                        Error = "Ô 'TK Nợ' phải nhập là số ở dòng thứ " + i.ToString() + "!";
                        return false;
                    }
                    else
                    {
                        if (!KiemTraDinhKhoanNo(DinhKhoanNo, TaiKhoanNo))
                        {
                            Error = "Ô 'TK Nợ' ở dòng thứ " + i.ToString() + " không tôn tại trong bộ danh mục định khoản nợ!";
                            return false;
                        }
                    }
                    if (gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value == null || !int.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value.ToString(), out TaiKhoanCo))
                    {
                        Error = "Ô 'TK Có' phải nhập là số ở dòng thứ " + i.ToString() + "!";
                        return false;
                    }
                    else
                    {
                        if (!KiemTraDinhKhoanCo(DinhKhoanCo, TaiKhoanCo))
                        {
                            Error = "Ô 'TK Có' ở dòng thứ " + i.ToString() + " không tôn tại trong bộ danh mục định khoản thu tiền!";
                            return false;
                        }
                    }
                }
                if (Count == 0)
                {
                    Error = "Nhập Thông tin chi tiết phiếu thu không được bỏ trống!";
                    return false;
                }
                else
                {
                    return true;
                }
            }
            catch (Exception ex)
            {
                Error = "Khởi tạo phiếu thu không thành công! xin vui lòng kiểm tra lại \r\n" + ex.Message;
                return false;
            }

        }

        private bool KiemTraDinhKhoanNo(List<DINH_KHOAN_NO> DinhKhoanNo, int TaiKhoanNo)
        {
            try
            {
                for (int i = 0; i < DinhKhoanNo.Count; i++)
                {
                    if (DinhKhoanNo[i].TAI_KHOAN_NO == TaiKhoanNo)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }

        }

        private bool KiemTraDinhKhoanCo(List<DINH_KHOAN_CO> DinhKhoanCo, int TaiKhoanCo)
        {
            try
            {
                for (int i = 0; i < DinhKhoanCo.Count; i++)
                {
                    if (DinhKhoanCo[i].TAI_KHOAN_CO == TaiKhoanCo)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }

        }

        private void TinhTongCongNo()
        {
            try
            {
                double TongTienThu = 0;
                double TongChietKhau = 0;
                for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
                {
                    double TienThu;
                    double ChietKhau;
                    if (double.TryParse((gvPhieuThuChiTiet.Rows[i].Cells["TienThu"].Value == null ? "0" : gvPhieuThuChiTiet.Rows[i].Cells["TienThu"].Value.ToString()), out TienThu))
                    {
                        TongTienThu += TienThu;
                    }
                    if (double.TryParse((gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value == null ? "0" : gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value.ToString()), out ChietKhau))
                    {
                        TongChietKhau += ChietKhau;
                    }
                }

                lblTongTienThu.Text = clsSupport.CurrencyNumber(TongTienThu.ToString());
                lblTongChietKhau.Text = clsSupport.CurrencyNumber(TongChietKhau.ToString());
                lblSoTienChu.Text = hsTool.ConvertMoneyToText(TongTienThu.ToString());
            }
            catch (Exception ex)
            { }

        }

        private void SetPermission()
        {
            btnLuu.Enabled = clsUser.LayThongTinPhanQuyen("PhieuThu").ChucNang.Sua;
            btnXoa.Enabled = clsUser.LayThongTinPhanQuyen("PhieuThu").ChucNang.Xoa;
        }

        #endregion
    }
}
